package com.leezai.mqtt.utils;

import java.util.Set;

public class TopicMatcher {

    /**
     * 根据实际topic匹配配置中的通配符topic
     * @param actualTopic 实际收到的topic
     * @param topicSet 配置的topic集合
     * @return 匹配的配置topic，如果未找到返回null
     */
    public static String matchTopic(String actualTopic, Set<String> topicSet) {
        if (actualTopic == null || topicSet == null) {
            return null;
        }

        // 首先尝试精确匹配
        if (topicSet.contains(actualTopic)) {
            return actualTopic;
        }

        for (String configTopic : topicSet) {
            if (isTopicMatch(actualTopic, configTopic)) {
//                System.out.println("匹配上了 "+configTopic);
                return configTopic;
            }
        }

        return null;
    }

    /**
     * 判断实际topic是否匹配配置的topic（支持通配符+）
     * @param actualTopic 实际收到的topic
     * * @param configTopic 配置中的topic
     * @return 是否匹配
     */
    public static boolean isTopicMatch(String actualTopic, String configTopic) {
        if (actualTopic == null || configTopic == null) {
            return false;
        }

        // 按"/"分割topic
        String[] actualParts = actualTopic.split("/");
        String[] configParts = configTopic.split("/");

        // 如果层级不同，不匹配
        if (actualParts.length != configParts.length) {
            return false;
        }

        // 逐级比较
        for (int i = 0; i < actualParts.length; i++) {
            // 如果配置中是"+"通配符，匹配任何非空值
            if ("+".equals(configParts[i])) {
                if (actualParts[i] == null || actualParts[i].isEmpty()) {
                    return false;
                }
                continue;
            }
            // 精确匹配
            if (!actualParts[i].equals(configParts[i])) {
                return false;
            }
        }

        return true;
    }
}
